#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstdlib>
using namespace std;
// //1.测试对信号的捕获
// void sigtest(int sig)
// {
//     cout << "get a sig!!!" << sig << endl;

// }
// int main()
// {
//     signal(2,sigtest);
//     while(true)
//     {
//         cout<< "hello,sig!!! pid :  " << getpid() <<endl;
//         sleep(2);
//     }
// }

// //2.模拟实现kill命令
// int main(int argc,char *argv[])
// {
//     if(argc!=3)
//     {
//         cerr << "Usage: " << argv[0] << "signum pid" << endl;
//         return 1;
//     }
//     pid_t pid=stoi(argv[2]);
//     int signum=stoi(argv[1]);
//     kill(pid,signum);
// }

// //3.模拟abort测试
// void handler(int sig)
// {
//     cout << "get a sig: " << sig << endl;
// }
// int main()
// {
//     signal(6,handler);
//     while (true)
//     {
//         /* code */
//         sleep(1);
//         cout << "hello bit,pid :" << getpid() <<endl;
//         abort();
//     }
    
// }

// //4.alarm（闹钟）函数

//1>单个alarm案例
// void handler(int sig)
//     {
//         cout << "get a sig: " << sig << endl;
//         exit(1);
//     }
// int main()
// {
//     int cnt=1;
//     alarm(1);
//     signal(SIGALRM,handler); //定时信号
//     while (true)
//     {
//         /* code */
//         cout << "cnt: " << cnt << endl;
//         cnt++;
//     }
// }

//2>多个alarm
// int main()
// {
//     int cnt=1;
//     alarm(10);
//     sleep(4);
//     int n=alarm(2); // 返回上一个定时器的剩余时间，并设置一个新的定时器，取消之前的定时器
//     cout<<"n: "<< n <<endl;
//     return 0;
// }

// //4.硬件产生异常
// int main()
// {
//     //1>空指针解引用
//     /*int *p =nullptr;
//     *p=100;*/
//     //2>除0问题
//     int a=10;
//     a/=0;
//     while(true)
//     {
//         cout << "hello bit,pid: " << endl;
//         sleep(1);
//     }
// }

// //5.core dump
int Sum(int start, int end)
{
    sleep(3);
    int sum = 0;
    for(int i = start; i <= end; i++)
    {
        sum /= 0; // core
        sum += i;
    }
    return sum;
}
 
int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        sleep(1);
        // child
        Sum(0, 10);
        exit(0);
    }
    // father
    int status = 0;
   pid_t rid = waitpid(id, &status, 0);
    if(rid == id)
    {
        printf("exit code: %d, exit sig: %d, core dump: %d\n", (status>>8)&0xFF, status&0x7F, (status>>7)&0x1);
    }
    
    return 0;
}
